#js 

 [Правила оформления документации JavaScript](https://jsdoc.app/tags-type.html)
 [Плагин для IDEA: отрисовка UML диаграммы классов](https://plugins.jetbrains.com/plugin/17380-uml-javascript-and-typescript)
#### Чтение файла GET запросом
```
function sendGetRequest(file) {
    let xmlHttpRequest = new XMLHttpRequest()
    xmlHttpRequest.open("GET", file, false)
    let result;
    xmlHttpRequest.onreadystatechange = function() {
        if (xmlHttpRequest.readyState === 4) {
            if (xmlHttpRequest.status === 200 || xmlHttpRequest.status == 0) {
                result = xmlHttpRequest.responseText
            }
        }
    }
    xmlHttpRequest.send(null)
    return result;
}

let text = sendGetRequest('https://cdn.jsdelivr.net/gh/prebid/currency-file@1/latest.json')
console.log(text)

PS: при использовании в расширении в inject_script.js позволяет получать данные как с удаленных ресурсов, так и из файлов, расположенныъ в запакованном расширении. Для этого необходимо в скрипт передать идентификатор расширения и сформировать запрос по адресу:
> chrome-extension://${idExtension}/${fileName}

	idExtension - идентификатор расширения
	fileName - имя файла расширения
```

#### Отображения нажатий по элементам
```
document.addEventListener('click', function(e) {
    e = e || e.event;
    var target = e.target || e.srcElement;
    var text = target.textContent || target.innerText;
    var tagName = target['tagName'];
    console.log('Нажатие по элементу с тэгом: ' + tagName + ' и тестом: ' + text);
}, false);
```
#### Загрузка текстового файла
```
function download(filename, text) {
	var element = document.createElement('a')
	element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text))
	element.setAttribute('download', filename)
	
	element.style.display = 'none'
	if (document.body === null) {
		if (document.head !== null) {
			document.head.appendChild(element)
			element.click()
			document.head.removeChild(element)
		} else {
			throw new Error('Невозможно прикрепить загружаемый элемент к странице')
		}
	}
}
download('fileName.txt', 'Текст для сохранения в файл')
```
#### Преобразование url
```
let url = 'https://www.google.com:8081/search?q=t.me%2Fbookofgeek&sca_esv=562340993&sxsrf=AB5stBgMzv7iH3-KcuWWa2oQwACpeMRL_w%3A1693747736680&ei=GIr0ZJSXKYa3wPAP79e5sAw'

function getQueryParamsFromUrl(url) {
	return url.split(/[?#]/)[1]
}

function getHostPortPathFromUrl(url) {
	return url.split(/[?#]/)[0]
}

function getPathFromUrl(url) {
	let req = /.+?:\/\/.+?(\/.+?)(?:#|\?|$)/
	let path = req.exec(url)[1]
	return path
}

function getHostPortFromUrl(url) {
	let req = /.+?:\/\/.+?(\/.+?)(?:#|\?|$)/
	let host = req.exec(url)[0]
	let path = req.exec(url)[1]
	return host.replace(path, '').replace('?', '')
}

console.log('QueryParams: ' + getQueryParamsFromUrl(url))
console.log('HostPortPath: ' + getHostPortPathFromUrl(url))
console.log('Path: ' + getPathFromUrl(url))
console.log('HostPort: ' + getHostPortFromUrl(url))
```
#### Содержимое указанного объекта в виде Json
```
// object - объект для перебора ключей
// isNullShow - отображать значения null, true: да, false: нет
function getObjectScoupe(object, isNullShow) {
    let values = {}
    Object.keys(object).forEach(key => {
        try {
            let value = JSON.parse(JSON.stringify(object[key]));
            if ((value === null) === isNullShow) {
                values[key] = value;
            }
        } catch { }
    });
    let result = {}
    result[object.constructor.name] = values
    return JSON.stringify(result, null, 4)
}
console.log(getObjectScoupe(window, false))
```
#### Список переменных для текущей области видимости
```
// name - имя ключа для параметров в Json
function getGlobalsVariables(name) {
    const iframe = window.document.createElement("iframe");
    iframe.src = "about:blank";
    let browserGlobals = {}
    if (document.head) {
        window.document.head.appendChild(iframe);
        browserGlobals = Object.keys(iframe.contentWindow);
        window.document.head.removeChild(iframe);
    } else if (document.documentElement) {
        window.document.documentElement.appendChild(iframe);
        browserGlobals = Object.keys(iframe.contentWindow);
        window.document.documentElement.removeChild(iframe);
    }
    const runtimeGlobals = Object.keys(window).filter((key) => {
        const isFromBrowser = browserGlobals.includes(key);
        return !isFromBrowser;
    });
    let result = {}
    result[name] = runtimeGlobals
    return JSON.stringify(result, null, 4)
}
console.log(getGlobalsVariables('Globals Variables for Content Script'))
```
#### Проверка является ли содержимое переменной объектом
```
function isObject(value) {
    return (typeof value === 'object' && value !== null && !Array.isArray(value))
}
```
#### Список методов объекта для экземпляра класса
```
let url = new URL('https://www.github.io/')

console.log(Object.getOwnPropertyNames(Object.getPrototypeOf(url)))
/// или
console.log(Object.getOwnPropertyNames(URL.prototype))
```
#### Список функций объекта для экземпляра класса
```
let url = new URL('https://www.github.io/')
function getAllFuncts(toCheck) {
    let props = new Array()
    let obj = toCheck
    do {
        props.push(...Object.getOwnPropertyNames(obj))
    } while (obj = Object.getPrototypeOf(obj))

    return props.sort().filter((e, i, arr) => {
        if (e != arr[i+1] && typeof toCheck[e] == 'function') {
            return true
        }
    })
}
console.log(getAllFuncts(url))
```
#### Список функций объекта для экземпляра класса без конструктора
```
let url = new URL('https://www.github.io/')
let instanceOnly = Object.getOwnPropertyNames(Object.getPrototypeOf(url)).filter(prop => prop != 'constructor')
console.log(instanceOnly)
```
#### Список статичных функций объекта для экземпляра класса
```
let url = new URL('https://www.github.io/')
let staticOnly = Object.getOwnPropertyNames(Object.getPrototypeOf(url)).filter(prop => typeof URL[prop] === 'function')
console.log(instanceOnly)
```
#### Получить имя класса
```
/**
* Получить имя класса переданного экземпляра объекта
* @param {*} obj экземпляр класса
* @returns имя класса объекта
*/
function getClass(obj) {
	let type = typeof(obj)
	if (type !== 'object') {
		return type
	} else {
		return obj.constructor.name
	}
}

class TestClassName {
    method() {}
}
let testClassName = new TestClassName()
console.log(getClass(testClassName))
```
#### Получить все свойства объекта
```
/**
 * Получить все свойства объекта
 * @param {Object} obj экземпляр класса или класс
 * @returns 
 */
function getAllProps(obj) {
    let result = new Array()
    for(; obj != null; obj = Object.getPrototypeOf(obj)) {
        let op = Object.getOwnPropertyNames(obj)
        for(let i=0; i < op.length; i++) {
            if (result.indexOf(op[i]) == -1) {
                result.push(op[i])
            }
        }
    }
    return result
}
let url = new URL('https://www.github.io/')
console.log(props(url))
```
#### Вывести содержимое объекта
```
// TODO Требуется переработать метод на возврат JSON обойденных элементов
function logAllProp(obj) {
    if (obj == null) {
        return
    }
    console.log(obj.constructor.name, Object.getOwnPropertyNames(obj))
    logAllProp(Object.getPrototypeOf(obj))
}
logAllProp(URL)
```
#### Вывести содержимое объекта
```
// TODO Требуется доработать, вывод происходит только при отключении проверки в объекте
function prototypeProp(obj) {
    let result = new Array()
    for (let prop in obj) {
        console.log(prop)
        if (!obj.hasOwnProperty(prop)) {
            result.push(prop)
        }
    }
    return result
}
console.log(prototypeProp(URL.prototype))
console.log(prototypeProp(URL))
```